import re
from dingtalkchatbot.chatbot import DingtalkChatbot
import time
import jenkins
import sys
import os
import json

# jenkins登录地址
jenkins_url = "http://127.0.0.1:8282/"
# 获取jenkins对象
server = jenkins.Jenkins(jenkins_url, username='xianzhe', password='xianzhe')  # Jenkins登录名 ，密码
# job名称
job_name = "job/gitlab_demo/"  # Jenkins运行任务名称
# job的url地址
job_url = jenkins_url + job_name
# 获取最后一次构建
job_last_build_url = server.get_info(job_name)['lastBuild']['url']
# 报告地址
report_url = job_last_build_url + 'allure'  # 'allure'为我的Jenkins全局工具配置中allure别名


class DingTalk:
    # 定一个参数：html_path,每次调用此方法时要穿这个参数
    def read_report(self, html_path):
        # 打开这个html文件，并存在变量 f 中
        f = open(html_path, 'r', encoding='utf-8')
        # 将html读取后存在变量 html中
        html = f.read()
        # 将上边读取的结果中筛选 所有span标签的数值，这个点要着重讲一下，筛选的值
        # 要具体看你报告的情况，因为我的报告测试用例总数和成功数是存在span标签中，所以
        # 我筛选的是这样，你们的要具体看自己的，具体怎么筛选可以百度一下，html格式
        # 如何读取
        table = re.findall(r'<span>(.*?)</span>', html, re.S)
        # 这是获取第二个值就是用例总数
        all_case = table[1]
        # 这是获取第五个值是用例成功的数
        success_case = table[4]
        # 然后将结果拼接后 返回出去
        return {"本次共执行用例总数": all_case,
                "执行成功用例": success_case}

    def send_dingtalk(self):
        d = {}
        path = os.path.abspath(os.path.dirname((__file__)))

        try:
            with open(path + r'/allure-results/html/export/prometheusData.txt', 'r') as f:
                for lines in f:  # 通常这里应该是 'line' 而不是 'lines'，因为每次迭代都是一行
                    parts = lines.strip('\n').split(' ')  # 去除换行符并按空格分割
                    if len(parts) >= 2:  # 确保至少有两个元素
                        launch_name = parts[0]
                        num = parts[1]
                        d.update({launch_name: num})  # 更新或添加键值对到字典
            print(d)  # 在文件读取完成后打印字典
        except FileNotFoundError:
            print("文件未找到或无法打开")
        except IOError as e:
            print(f"打开文件时发生I/O错误: {e}")
        print(d)
        retries_run = d.get('launch_retries_run')  # 运行总数
        print('运行总数:{}'.format(retries_run))
        status_passed = d.get('launch_status_passed')  # 通过数量
        print('通过数量：{}'.format(status_passed))
        status_failed = d.get('launch_status_failed')  # 不通过数量
        print('没通过数量：{}'.format(status_failed))
        status_broken = d.get('launch_status_broken')  # 中断数量

        con = {
            "content": "Pytest_Allure_Demo自动化脚本执行完成。\n"
                       "测试概述:\n"
                       "运行总数: " + retries_run + "\n"
                        "通过数量: " + status_passed + "\n"
                        "失败数量: " + status_failed + "\n"
                        "中断数量: " + status_broken + "\n"                        
                        "构建地址：" + job_url + "\n"
                          "报告地址：" + report_url
        }

        # 获取路径，目的是找到report.html文件的路径
        path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))  # 获取当前路径
        html_path = os.path.join(path, "allure-results/html/index.html")  # 获取html格式报告文件的路径
        tile = time.strftime("%Y-%m-%d %H:%M:%S")
        # WebHook地址，你钉钉上创建自定义机器人时生成的值
        webhook = 'https://oapi.dingtalk.com/robot/send?access_token=77cb138bd0952cb521ae6aa232304a62e7afb149632c0d6358af02c0f976b7ef'
        # 初始化机器人小丁
        xiaoding = DingtalkChatbot(webhook)
        ding = DingTalk()
        jd = json.dumps(con)
        # xixi = ding.read_report(html_path)
        xiaoding.send_text(
            # Qa-审核后台自动化是机器人的关键字，必须要保持一致
            msg='Qa-冼喆\n\n' + con["content"] + "\n\n项目url：**/" + "\n\n执行时间：" + tile
        )
        print(con["content"])


if __name__ == '__main__':
    ding = DingTalk()
    ding.send_dingtalk()
